package cn.tannn.tcache.resp;

import io.netty.channel.ChannelHandlerContext;

import static cn.tannn.tcache.core.Command.CRLF;
import static cn.tannn.tcache.resp.IntegerProtocol.integerEncode;
import static cn.tannn.tcache.resp.Protocol.writeByteBuf;
import static cn.tannn.tcache.resp.StringProtocol.bulkStringEncode;

/**
 * 数组协议
 *
 * @author <a href="https://t.tannn.cn/">tnnn</a>
 * @version V1.0
 * @date 2024/6/15 下午11:27
 */
public class ArrayProtocol {

    /**
     * 封装数据 - array ,
     *
     * @param ctx   ChannelHandlerContext
     * @param array 数组
     */
    public static void array(ChannelHandlerContext ctx, String[] array) {
        writeByteBuf(ctx, arrayEncode(array));
    }


    /**
     * 处理 Arrays 协议数据的格式 ,  Arrays, 第一个字节是 "*"
     * @param array 数据
     * @return 格式化的数据
     */
    public static String arrayEncode(Object[] array) {
        StringBuilder sb = new StringBuilder();
        if (array == null) {
            sb.append("*-1").append(CRLF);
        } else if (array.length == 0) {
            sb.append("*0").append(CRLF);
        } else {
            sb.append("*").append(array.length).append(CRLF);
            for (int i = 0; i < array.length; i++) {
                Object obj = array[i];
                if(obj == null){
                    sb.append("$-1"+CRLF);
                }else{
                    if(obj instanceof Integer integer){
                        sb.append(integerEncode(integer));
                    } else if (obj instanceof String string){
                        sb.append(bulkStringEncode(string));
                    } else if (obj instanceof Object[] objs) {
                        sb.append(arrayEncode(objs));
                    }
                }
            }
        }
        return sb.toString();
    }
}
